import { defineStore } from 'pinia'
import { ref } from 'vue'
import { user } from '@/api'
import type { UserVO } from '@/api/user'
import router from '@/router'

export const useUserStore = defineStore('user', () => {
  // 用户信息
  const userInfo = ref<UserVO | null>(null)

  // 是否已登录
  const isLoggedIn = ref(false)

  // 用户角色
  const role = ref<string>('')

  // 设置用户信息
  function setUserInfo(info: UserVO) {
    userInfo.value = info
    role.value = info.role
    isLoggedIn.value = true

    // 保存登录状态到localStorage - 不再保存完整用户信息，仅保存必要信息
    localStorage.setItem('userRole', info.role)
    localStorage.setItem('userId', String(info.id))

    // 保存最后登录时间
    localStorage.setItem('lastLoginTime', String(Date.now()))
  }

  // 清除用户信息
  function clearUserInfo() {
    userInfo.value = null
    role.value = ''
    isLoggedIn.value = false
    localStorage.removeItem('userRole')
    localStorage.removeItem('userId')
    localStorage.removeItem('lastLoginTime')
  }

  // 获取用户信息
  async function fetchUserInfo() {
    try {
      const res = await user.getCurrentUser()
      if (res.code === 200 && res.data) {
        setUserInfo(res.data)
        return res.data
      } else {
        // 如果接口返回未登录错误，清除本地状态
        clearUserInfo()
        return null
      }
    } catch (error) {
      console.error('获取用户信息失败:', error)
      clearUserInfo()
      return null
    }
  }

  // 退出登录
  async function logout() {
    try {
      await user.logout()
    } catch (error) {
      console.error('登出失败:', error)
    } finally {
      clearUserInfo()
      router.push('/login')
    }
  }

  // 初始化
  async function init() {
    // 检查是否有本地存储的用户ID
    const userId = localStorage.getItem('userId')
    const userRole = localStorage.getItem('userRole')
    const lastLoginTime = localStorage.getItem('lastLoginTime')

    // 如果没有基本信息，认为未登录
    if (!userId || !userRole) {
      clearUserInfo()
      return null
    }

    // 检查登录是否已过期（例如24小时）
    const now = Date.now()
    const loginTime = lastLoginTime ? parseInt(lastLoginTime) : 0
    const oneDayMs = 24 * 60 * 60 * 1000

    if (now - loginTime > oneDayMs) {
      clearUserInfo()
      return null
    }

    // 临时设置基本信息
    role.value = userRole
    isLoggedIn.value = true

    // 总是尝试从服务器获取最新用户信息
    try {
      return await fetchUserInfo()
    } catch (error) {
      console.error('初始化用户信息失败:', error)
      // 如果获取失败，但我们有本地信息，保持登录状态
      // 这样即使临时网络问题也不会立即登出用户
      if (userId && userRole) {
        isLoggedIn.value = true
        role.value = userRole
        // 更新最后检查时间
        localStorage.setItem('lastLoginTime', String(Date.now()))
        return null
      }

      // 如果没有本地信息，清除状态
      clearUserInfo()
      return null
    }
  }

  return {
    userInfo,
    role,
    isLoggedIn,
    setUserInfo,
    fetchUserInfo,
    logout,
    init,
  }
})
